Computer software can be written by software developers using one or more software development tools. In software development programs, the developer writes a series of code segments called methods or functions that are each designed to perform one or more tasks. The developer also writes code that connects the methods together so that they are executed in one or more desired orders. The typical way of connecting methods together is by making a call to a particular method from within another method. Simple software applications may be written as one or more methods that are contained within a single program file. However, with more comprehensive software applications, it is common is to separate the functionality of the software application into different components or assemblies that are contained in different files. When a first component of the application wants to call one or more methods that are contained in a second component, a reference is made to the second component in the source code of the first component so the first component knows how to find and communicate with the second component. After the reference is made, code can be written to directly call a desired method in the second component.
One problem with directly referencing a particular method in one component from another component is that there is no easy way for a developer to come in later and use different functionality for that particular method. One way the developer can implement the new functionality is to change the source code within that specific method to achieve the different functionality. However, the problem with this potential solution is that the developer may want to keep that particular method intact for use in some situations, yet use a totally different implementation for the present situation. Another option is to write a totally new method that contains the different functionality, and then change the first component to directly reference and call the new method. Both of these solutions can be tedious and greatly limit the extensibility of an application after original product shipment. For example, in the case of MICROSOFT® programming technologies, while extensibility can be fairly achievable using the MICROSOFT® Component Object Model (COM), it is not as achievable using MICROSOFT® .NET. Even when using COM to create the abstraction of interface→implementation, there is no method to determine dependencies or closure. This is especially problematic when derivations are made on specific implementations of a particular method. This locks the original code author to either being locked into one implementation, or to break extensibility based upon that implementation.